package ch06.verlet
{
	import flash.display.Graphics;
	import flash.geom.Rectangle;

	/**
	 * 创建一个VerletPoint 类，它封装了一个点所拥有的Verlet 积分法的所有行为。是点，
	   就需要 x 和 y 属性，还有 old x 和 old y 以及一个 update 函数。update 函数是告诉点之前
	   在哪里，然后该去哪里，并使用什么样的速度。然后保存当前位置为之前位置，以便下次使
	   用。
	 */
	public class VerletPoint
	{
		public var x:Number;
		public var y:Number;

		private var _oldX:Number;
		private var _oldY:Number;


		public function VerletPoint(x:Number, y:Number)
		{
			setPosition(x, y);
		}

		public function update():void
		{
			var tempX:Number = x;
			var tempY:Number = y;
			x += vx;
			y += vy;
			_oldX = tempX;
			_oldY = tempY;
		}

		public function setPosition(x:Number, y:Number):void
		{
			this.x = _oldX = x;
			this.y = _oldY = y;
		}

		/**
		 * 点的约束
		 * @param	rect
		 */
		public function constrain(rect:Rectangle):void
		{
			x = Math.max(rect.left, Math.min(rect.right, x));
			y = Math.max(rect.top, Math.min(rect.bottom, y));
		}

		public function set vx(value:Number):void
		{
			_oldX = x - value;
		}

		public function get vx():Number
		{
			return x - _oldX;
		}

		public function set vy(value:Number):void
		{
			_oldY = y - value;
		}

		public function get vy():Number
		{
			return y - _oldY;
		}

		/**
		 * render 函数会以给定的 Graphics 参数绘制一个小圆点。这对你最终的作品可能没什么
		   用，但对debug 或者测试来说很有用。
		 * @param	g
		 */
		public function render(g:Graphics):void
		{
			g.beginFill(0);
			g.drawCircle(x, y, 4);
			g.endFill();
		}

	}
}